#ifndef typebase_compil_h
#define typebase_compil_h

#include <iostream>
#include <vector>
#include "Type.hpp"
#include "Value.hpp"
#include "3adCode.hpp"

class TypeBase: public Type {
	//virtual bool operator==( const Type &toCompare );
	//virtual bool operator!=(const Type &toCompare ) ;
};



class TypeTemp: public TypeBase {
	private: 
		Type * finalType;
		int idTemp;

	public:
		TypeTemp(int idTemp) ;
		TypeTemp() ;
		void show() ;
		void setType(Type * type);
		Type * clone() ;
		int getTempId() {return idTemp;};
};

/* ******************************************************
 * ****************** OrderedType
 * ****************************************************** */

class OrderedType: public TypeBase {
	public:
		virtual int getOrd(Value *val)=0;

};
/* ******************************************************
 * ****************** IntegerType
 * ****************************************************** */
class TypeInteger: public OrderedType {
	public:
		TypeInteger() ;
		virtual int getOrd(Value *val) ;
		void show() ;
		Type * clone() ;
		bool isApplicable(CodeInstruction operation);

};
/* ******************************************************
 * ******************  TypeReal
 * ****************************************************** */

class TypeReal: public OrderedType {
	public:
		TypeReal() ;
		virtual int getOrd(Value *val) ;
		void show() ;
		Type * clone() ;
		bool isApplicable(CodeInstruction operation);
};

/* ******************************************************
 * ******************  TypeBoolean
 * ****************************************************** */

class TypeBoolean: public TypeBase {
	public:
		TypeBoolean() ;
		void show() ;
		Type * clone() ;
		bool isApplicable(CodeInstruction operation);
};


/* ******************************************************
 * ******************  TypeChar
 * ****************************************************** */

class TypeChar: public OrderedType {
	public:
		TypeChar() ;
		virtual int getOrd(Value *val) ;
		void show() ;
		Type * clone() ;
};


/* ******************************************************
 * ******************  TypeString
 * ****************************************************** */

class TypeString: public TypeBase {
	public:
		TypeString() ;
		void show() ;
		Type * clone() ;
};

/* ******************************************************
 * ******************  TypeString
 * ****************************************************** */

class TypeNil: public TypeBase {
	public:
		TypeNil() ;
		void show() ;
		Type * clone() ;
};


#endif
